// pub fn add(left: usize, right: usize) -> usize {
//     left + right
// }
#[warn(dead_code)]
struct Counter {
    count: u32
}

impl Counter {
    fn new () -> Counter {
        Counter {count: 0}
    }
}

impl Iterator for Counter {
    type Item = u32;
    // 实现next方法，返回Option<Self::Item>
    // 返回Option<Self::Item>，因为迭代器可能会返回None
    fn next(&mut self) -> Option<Self::Item>{
        if self.count < 5 {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }

}
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
       let mut counter = Counter::new();
       assert_eq!(counter.next(), Some(1));
       assert_eq!(counter.next(), Some(2));
       assert_eq!(counter.next(), Some(3));
    }
    #[test]
    fn iter_other() {
        // 本案例中, 使用zip将两个迭代器组合在一起, 第二个迭代器从第二个元素开始
        // 使用map将每个元素乘以自身
        // 使用filter过滤出能被3整除的元素
        // 使用sum计算所有元素的和
        let sum: u32 = Counter::new().zip(Counter::new().skip(1))
            .map(|(a,b)| a * b)
            .filter(|x| x % 3 == 0)
            .sum();
        assert_eq!(18, sum);
    }
}
